package com.mrx.xfriendship.controller;

import com.mrx.commons.annotations.XLog;
import com.mrx.commons.util.asserts.Asserts;
import com.mrx.xfriendship.model.dto.*;
import com.mrx.xfriendship.model.vo.*;
import com.mrx.xfriendship.service.IAdminService;
import com.mrx.xfriendship.service.IMinioService;
import com.mrx.xfriendship.util.SecurityUtil;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;

/**
 * 后台系统 接口
 *
 * @author Mr.X
 * @since 2023-01-21 10:59
 */
@XLog
@RestController
@RequestMapping("/admin")
public class AdminController {

    @DubboReference
    private IAdminService adminService;

    @Resource
    private IMinioService minioService;

    /**
     * dashboard 页面接口
     */
    @GetMapping("/dashboard")
    public Result<DashboardDTO> dashboard() {
        return Result.success(adminService.dashboard());
    }

    /**
     * user-manager 页面接口, 列出所有用户信息
     *
     * @param vo 分页查询参数
     */
    @GetMapping("/listUsers")
    public Result<PageDTO<UserManagerDTO>> listUsers(UserManagerPageVO vo) {
        return Result.success(adminService.listUsers(vo));
    }

    /**
     * user-manager 编辑用户信息 接口
     *
     * @param vo 新的用户信息
     */
    @PostMapping("/updateUser")
    public Result<String> updateUser(@RequestBody UpdateUserVO vo) {
        if (SecurityUtil.getCurrentUserId().equals(vo.getId())) {
            Asserts.CAN_NOT_UPDATE_MY_ROLE.checkTrue(SecurityUtil.getCurrentUserRole().equals(vo.getRole()));
        }
        adminService.updateUser(vo);
        return Result.success("编辑成功");
    }

    /**
     * user-manager 页面删除用户 接口
     *
     * @param id 要删除的用户 id
     */
    @GetMapping("/deleteUser/{id}")
    public Result<String> deleteUser(@PathVariable Integer id) {
        Asserts.CAN_NOT_DELETE_ME.checkTrue(!SecurityUtil.getCurrentUserId().equals(id));
        adminService.deleteUser(id);
        return Result.success("删除成功");
    }

    /**
     * tag-manager 页面接口, 列出所有 tag 信息
     *
     * @param vo 分页查询参数
     */
    @GetMapping("/listTags")
    public Result<PageDTO<TagDTO>> listTags(TagManagerPageVO vo) {
        return Result.success(adminService.listTags(vo));
    }

    /**
     * tag-manager 更新 tag 接口
     *
     * @param tagDTO 新的 tag 内容
     */
    @PostMapping("/updateTag")
    public Result<String> updateTag(@RequestBody TagDTO tagDTO) {
        adminService.updateTag(tagDTO);
        return Result.success("更新 板块信息 成功");
    }

    /**
     * tag-manager 更新 tag 头像 接口
     *
     * @param file 头像文件
     */
    @PostMapping("/uploadTagAvatar")
    public Result<String> uploadTagAvatar(@RequestParam("file") MultipartFile file) {
        return Result.success("头像上传成功", minioService.upload(file));
    }

    /**
     * tag-manager 删除 tag 接口
     *
     * @param id 要删除的 tag id
     */
    @GetMapping("/deleteTag/{id}")
    public Result<String> deleteTag(@PathVariable Integer id) {
        adminService.deleteTag(id);
        return Result.success("删除 板块 成功");
    }

    /**
     * tag-manager 新增 tag 接口
     *
     * @param dto 新的 tag 内容
     */
    @PostMapping("/addTag")
    public Result<String> addTag(@RequestBody TagDTO dto) {
        adminService.addTag(dto);
        return Result.success("添加 板块 成功");
    }

    /**
     * post-manager 列出所有 post 接口
     *
     * @param vo 分页查询条件
     */
    @GetMapping("/listPosts")
    public Result<PageDTO<PostDTO>> listPosts(PostManagePageVO vo) {
        return Result.success(adminService.listPosts(vo));
    }

    /**
     * post-manager 更新 帖子 接口
     *
     * @param dto 新的 帖子 内容
     */
    @PostMapping("/updatePost")
    public Result<String> updatePost(@RequestBody PostDTO dto) {
        adminService.updatePost(dto);
        return Result.success("编辑 帖子 成功");
    }

    /**
     * post-manager 删除 帖子 接口
     *
     * @param id 要删除的 帖子 的 id
     */
    @GetMapping("/deletePost/{id}")
    public Result<String> deletePost(@PathVariable Integer id) {
        adminService.deletePost(id);
        return Result.success("删除 帖子 成功");
    }

    /**
     * 分页查询 系统配置 接口
     *
     * @param vo 分页查询参数
     */
    @GetMapping("/listConfig")
    public Result<PageDTO<SystemInfoDTO>> listConfig(SystemManagerVO vo) {
        return Result.success(adminService.listConfig(vo));
    }

    @PostMapping("/updateConfig")
    public Result<String> updateConfig(@RequestBody UpdateSystemInfoVO vo) {
        adminService.updateConfig(vo);
        return Result.success();
    }

}
